/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import controlador.ManejadorPropiedades;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 *
 * @author Antonio
 */
public class Capitulo {

    private ArrayList<String> titulo;
    private ArrayList<String> version;
    private String temporada;
    private String numeroCapitulo;
    private String extension;

    public Capitulo() {
        this.titulo = new ArrayList<String>();
        this.version = new ArrayList<String>();
        this.temporada = new String();
        this.numeroCapitulo = new String();
        this.extension = new String();
    }

    public Capitulo(ArrayList<String> titulo, ArrayList<String> version) {
        this.titulo = titulo;
        this.version = version;
        this.temporada = new String();
        this.numeroCapitulo = new String();
    }

    public Capitulo(String archivo) throws FileNotFoundException, IOException {
        this.analizaNombre(archivo);
    }

    /**
     * *********
     * Getters *
     **********
     */
    public ArrayList<String> getTitulo() {
        return titulo;
    }

    public ArrayList<String> getVersion() {
        return version;
    }

    public String getExtension() {
        return extension;
    }

    /**
     * *********
     * Setters *
     **********
     */
    public void setTitulo(ArrayList<String> titulo) {
        this.titulo = titulo;
    }

    public void setVersion(ArrayList<String> version) {
        this.version = version;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

    /**
     * *********
     * Metodos *
     **********
     */
    /**
     * Analiza el nombre del archivo y crea un tipo serie para que devuelva el
     * constructor.
     *
     * @param nombreArchivo
     * @throws IOException
     */
    private void analizaNombre(String nombreArchivo) throws IOException {
        StringTokenizer tokenizer = new StringTokenizer(nombreArchivo, ".");
        ArrayList<String> tituloTemp = new ArrayList<String>();
        ArrayList<String> versionTemp = new ArrayList<String>();
        int numeroPartes = tokenizer.countTokens();

        if (numeroPartes > 1) {
            while (tokenizer.hasMoreElements()) {
                if (tituloTemp.size() < numeroPartes) {
                    String aux = tokenizer.nextToken();
                    if (!this.contieneSeparadores(aux)) {
                        tituloTemp.add(aux);
                    } else {
                        //TODO: obtener version. necesitamos pasarle el separador utilizado
                        String auxSeparadores = ManejadorPropiedades.damePropiedad("separadores");
                        String[] separadores = auxSeparadores.split(";");
                        for(int i=0; i<separadores.length;i++){
                            if(aux.contains(separadores[i])){
                                this.version.add(this.obtenerVersion(aux, separadores[i]));
                                break;
                            }
                        }
                        versionTemp.add(aux);
                    }
                } else if (tituloTemp.size() == numeroPartes) {
                    this.extension = tokenizer.nextToken();
                }
            }
        }
        this.titulo = tituloTemp;
        this.version = versionTemp;
    }

    /**
     * Metodo que devuelve "true" si contiene un separador que le pasamos como
     * parametro.
     *
     * @param nombre
     * @return
     * @throws IOException
     */
    private boolean contieneSeparadores(String nombre) throws IOException {
        boolean resultado = false;

        String auxSeparadores = ManejadorPropiedades.damePropiedad("separadores");
        String[] separadores = auxSeparadores.split(";");

        for (int i = 0; i < separadores.length; i++) {
            if (nombre.contains(separadores[i])) {
                resultado = true;
            }
        }

        return resultado;
    }

    /**
     * Metodo que separa el titulo de la version.
     *
     * @param nombreArchivo
     * @return
     * @throws IOException
     */
    private String separaTituloVersion(String nombreArchivo) throws IOException {
        String resultado = new String();
        String auxSeparadores = ManejadorPropiedades.damePropiedad("separadores");
        String[] separadores = auxSeparadores.split(";");
        for (int i = 0; i < separadores.length; i++) {
            if (nombreArchivo.contains(separadores[i])) {
                StringTokenizer tokenizer = new StringTokenizer(nombreArchivo, separadores[i]);
                if (tokenizer.hasMoreTokens()) {
                    resultado = tokenizer.nextToken();
                    break;
                }
            }
        }


        return resultado;
    }

    /**
     * Metodo privado que obtiene la version del capitulo.
     *
     * @param rawVersion
     * @param separador
     * @return
     * @throws IOException
     */
    private String obtenerVersion(String rawVersion, String separador) throws IOException {
        String resultado = new String();
        StringTokenizer grupoSeparadores = new StringTokenizer(ManejadorPropiedades.damePropiedad("gruposSeparadores"), ";");
        String separadorAbierto = null;
        String separadorCerrado = null;
        while (grupoSeparadores.hasMoreTokens()) {
            String aux = grupoSeparadores.nextToken();
            StringTokenizer auxTokens = new StringTokenizer(aux, ",");
            while (auxTokens.hasMoreTokens()) {
                separadorAbierto = auxTokens.nextToken();
                separadorCerrado = auxTokens.nextToken();
            }
            StringTokenizer versionSeparadorAbierto = new StringTokenizer(rawVersion, separadorAbierto);
            while (versionSeparadorAbierto.hasMoreTokens()) {
                String versionSeparadorAbiertoString = versionSeparadorAbierto.nextToken();
                if (versionSeparadorAbiertoString.contains(separadorCerrado)) {
                    StringTokenizer versionSeparadorCerrado = new StringTokenizer(versionSeparadorAbiertoString, separadorCerrado);
                    resultado = versionSeparadorCerrado.nextToken();
                }
            }
        }

        return resultado;
    }
}
